package material.encapsulation_algorithm.prepareRecipe;

/**
 * 我们加入了一个新方法调用，改变了templateMethod
 */
public abstract class AbstractClassHook {
    /**
     * 这就是模板方法。
     * 他被声明为final，以免子类改变这个算法的顺序
     */
    final void templateMethod() {
        /**模板方法定义了一连串的步骤，每一个步骤由一个方法代表。**/
        primitiveOperation1();
        primitiveOperation2();
        concreteOperation();
        hook();
    }

    /**
     * 在这个范例中有两个原语操作，具体子类必须实现他们
     */
    abstract void primitiveOperation1();

    abstract void primitiveOperation2();

    void concreteOperation() {
        //这里是实现
    }

    /**
     *这是一个具体的方法，但他什么都不做
     * 我们也可以有“默认不做事的方法”，我们称这种方法为“hook”(钩子）。
     * 子类可以视情况决定要不要覆盖它们。
     */
    void hook() {

    }
}
